"""
    读取asc文件，保存为图片
"""
from PIL import Image, ImageOps
import numpy

source = "Grid/lidar/lidar_asc.asc"
output = "Grid/lidar/lidar.bmp"
# 将ASCII DEM载入数组中
arr = numpy.loadtxt(source, skiprows=6)
# 将数组转换为图片
im = Image.fromarray(arr).convert("RGB")
# 图片增强
# 平衡和对比度增强
im = ImageOps.equalize(im)
im = ImageOps.autocontrast(im)
# 保存图片
im.save(output)


""" 
    HSV渲染
    H：色调 S:饱和度 V：值；相较于RGB，HSV处理容易的多
    本例使用Python内置的colorsys库进行转换，他允许在HSV和RGB之间来回切换；
    该库返回一个RGB值得百分比，然后必须映射成0~255之间的数字来表示每种颜色；
    
    本例中先把ASCII DEM转化成PIL图片，然后构造调色板，并将调色板应用到灰度图片上；
"""
from PIL import Image, ImageOps
import colorsys
import numpy


source = "Grid/lidar/lidar_asc.asc"
output = "Grid/lidar/lidar_HSV.bmp"

# 将ASCII DEM 载入数组中
arr = numpy.loadtxt(source, skiprows=6)
# 将numpy数组转换为一个PIL图片
# 将图片转为灰度图模式以便在彩色图片上叠加三个波段
im = Image.fromarray(arr).convert("L")

# 图片增强
im = ImageOps.equalize(im)
im = ImageOps.autocontrast(im)

# 开始构造渐变颜色调色板
palette = []

# 色调，饱和度，值
# 色彩空间始于黄色
h = .67  # 色调
s = 1    # 饱和度
v = 1    # 值

# 渐变颜色依次为 蓝-绿-黄-橙-红；蓝=底高程区域 红=高程较高区域
step = h/256.0
# 构建调色板
for i in range(256):
    rp, gp, bp = colorsys.hsv_to_rgb(h, s, v)
    r = int(rp * 255)
    g = int(gp * 255)
    b = int(bp * 255)
    palette.extend([r, g, b])
    h -= step

# 将调色板应用到图片上
im.putpalette(palette)

# 保存图片
im.save(output)








